#include<iostream>
#include<unistd.h>
#include<pthread.h>
#include<cstdio>
#include<vector>
using namespace std;


//临界资源模拟
// int count = 0;
// void* new_thread(void* args)
// {
//     while(1)
//     {
//         sleep(1);
//         count++;
//     }
// }

// int main()
// {
//     //我们定义一个全局的count来模仿我们的临界资源，主线程每一秒打印一次，新线程不停打印
//     pthread_t tid;
//     pthread_create(&tid, NULL, new_thread, (void*)"new thread");
//     while(1)
//     {
//         printf("the count is: %d\n", count);
//         sleep(1);
//     }

//     return 0;
// }


// #include <iostream>  
// using namespace std; 
// #include <unistd.h>  
// #include <pthread.h> 
// #include <cstdio>                          
// int count = 0;       
// void* new_thread(void* args)
//  {                    
//    while(1)           
//    {                  
//      sleep(1);        
//      count++;         
//    }                  
//  }                    
                      
//  int main()           
//  {                    
//    // 我们下面的代码是为了证明临界资源这个概念
//    // 我们将会定义一个整型count为临界资源
//    // 主线程每隔一秒打印这个临界资源                                                                                      
//    // 新县城不停的将这个数++
//    pthread_t tid;   
//    pthread_create(&tid , NULL , new_thread ,(void *)"new thread");
//    while(1)         
//    {                
//     printf("the count is: %d\n",count);
//     sleep(1);
//    }
//    return 0;
//    }


// //进程互斥测试，抢票，加锁互斥完成完成抢票逻辑
// const int NUM = 5;
// int ticket = 1000;
// pthread_mutex_t mutex;

// void* get_ticket(void* args)
// {
//     while(1)
//     {
//         pthread_mutex_lock(&mutex);
//         if(ticket > 1)
//         {
//             usleep(10000);//模拟漫长的业务流程
//             printf("I get a ticket . I am:%x, ticket left: %d\n", pthread_self(), --ticket);
//             pthread_mutex_unlock(&mutex);
//         }
//         else 
//         {
//             pthread_mutex_unlock(&mutex);
//             break;
//         }
//     }
//     pthread_exit((void*)0);
// }
// int main()
// {
//     pthread_t tid;
//     vector<pthread_t> v;
//     pthread_mutex_init(&mutex, NULL);
//     for(int i = 0; i < NUM; i++)
//     {
//         //usleep(10000);
//         //printf("I get a ticket . I am :%x, ticket left:%d\n", pthread_self(), --ticket);
//         pthread_create(&tid , NULL , get_ticket , (void *)"new pthread");
//         v.push_back(tid);
//     }

//     for(int i = 0; i < NUM; i++)
//     {
//         pthread_join(v[i], NULL);
//     }

//     pthread_mutex_destroy(&mutex);
//     return 0;
// }

//单线程模拟死锁
pthread_mutex_t mutex;

void* test_mutex(void* args)
{
    pthread_mutex_lock(&mutex);
    pthread_mutex_lock(&mutex);
    pthread_exit((void*)0);
}

int main()
{
    //申请死锁
    pthread_mutex_init(&mutex, NULL);
    pthread_t tid;
    pthread_create(&tid, NULL, test_mutex, (void*)"new thread");
    pthread_join(tid, NULL);
    pthread_mutex_destroy(&mutex);
    return 0;
}